/* fork开启子进程
衍生一个新的 Node.js 进程，并通过建立一个 IPC 通讯通道来调用一个指定的模块，该通道允许父进程与子进程之间相互发送信息
fork方法返回一个隐式创建的代表子进程的ChildProcess对象
子进程的输入/输出操作执行完毕后，子进程不会自动退出，必须使用process.exit()方法显式退出
*/
const {/*fork,*/spawn} = require('child_process');
const path = require('path');

const child = fork('fork.js',['a','b','c'],{
  cwd:path.join(__dirname,'test')
  ,silent:true //这句话的意思就是 ['ignore','ignore','ignore','ipc'] //默认为false 即stdio为[0,1,2,'ipc']

  /* options 选项对象
    cwd 指定子进程当前的工作目录
    env 属性值为一个对象，用于以"键名/键值"的形式为子进程指定环境变量
    encoding 属性值为一个字符串，用于指定输出及标准错误输出数据的编码格式，默认值为'utf8'
    silent 属性值为布尔值，当属性值为false时，子进程和父进程对象共享标准(输入/输出),true时不共享
  */
});

child.send('hello'/*,[setHandle]*/);

child.on('message', (m,setHandle) => {
  console.log('m:', m);
  child.kill();
});

// 模拟fork
function fork(modulePath, args, options = {}) {
  if (options.silent) {
    options.stdio = ['ignore', 'ignore', 'ignore', 'ipc'];
  } else {
    options.stdio = [0, 1, 2, 'ipc'];
  }
  delete options.silent;
  return spawn('node', [modulePath, ...args], options);
}
